package main

import "fmt"

//Map——Go语言内置类型

func main() {
	//declareMap()

	//visitMap()

	//traverseMap()

	deleteMap()
}

// 声明map
func declareMap() {
	//声明map方式一: 显式初始化
	m1 := map[string]string{
		"k1": "v1",
		"k2": "v2",
		"k3": "v3",
	}
	fmt.Printf("m1: %v, len: %d\n", m1, len(m1)) //通过len函数可以获取map长度

	//声明map方式二: 通过内置的make函数
	//最佳实践:创建map时尽量预估好容量
	m2 := make(map[string]string, 4)
	m2["k1"] = "v1"
	m2["k2"] = "v2"
	fmt.Printf("m2: %v, len: %d\n", m2, len(m2))
}

// 访问map
func visitMap() {
	m := map[string]string{
		"k1": "v1",
		"k2": "v2",
		"k3": "v3",
	}

	//访问map方式一: 通过comma-ok语法,判断key是否存在
	if v1, ok := m["k1"]; ok {
		fmt.Printf("k1 -> %s\n", v1)
	}

	//访问map方式二: 直接通过key获取value
	v2 := m["k2"]
	fmt.Printf("k2 -> %s\n", v2)

	//如果key不存在,value会返回对应类型的零值
	v4 := m["k4"]
	fmt.Printf("k4 -> %s\n", v4) //k4不存在,打印空字符串
}

// 遍历map,通过for-range方式
func traverseMap() {
	m := map[string]string{
		"k1": "v1",
		"k2": "v2",
		"k3": "v3",
		"k4": "v4",
	}

	//通过for-range方式遍历map
	//map中的键值对是无序的,每次遍历的顺序可能都不同
	for k, v := range m {
		fmt.Printf("%s -> %s\n", k, v)
	}
}

// 删除map中的元素
func deleteMap() {
	m := map[string]string{
		"k1": "v1",
		"k2": "v2",
		"k3": "v3",
		"k4": "v4",
	}
	fmt.Printf("删除元素前: %v\n", m)

	//使用内置的delete函数,删除map中的元素
	//delete函数并没有返回值,无法判断是否删除成功
	delete(m, "k2")
	fmt.Printf("删除元素后: %v\n", m)
}
